package com.are.odisea;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class ResolverOrdenMantenimiento
 */
@WebServlet("/SrvConfirmarOrden")
public class SrvConfirmarOrden extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public SrvConfirmarOrden() {
		super();
		// TODO Auto-generated constructor stub
	}

	@SuppressWarnings("unchecked")
	protected void ProcesarPeticion(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=ISO-8859-1");
		PrintWriter out = response.getWriter();

		HttpSession sesion = request.getSession();
		if (sesion.getAttribute("usuario") == null) {
			out.print("La sesion ha caducado... intente de nuevo por favor");
			return;
		}

		String usuario = (String) sesion.getAttribute("usuario");

		db conexion = null;
		String operacion = (String) request.getParameter("operacion");
		System.out.println("Operacion: " + operacion);
		try {

			if (operacion.equals("mantenimiento")) {
				conexion = new db();
				String id = (String) request.getParameter("id");
				String observacion = (String) request
						.getParameter("observacion");
				String estado = (String) request.getParameter("estado");

				BandejaReporte br = new BandejaReporte();
				GestionBandeja gb = new GestionBandeja(conexion);
				if (gb.FindOrdenReporte(Integer.parseInt(id))) {
					br = gb.getOrdenbandeja();
					GestionConsumos gc = new GestionConsumos(conexion);
					gc.setUsuario(usuario);

					String tipo_orden = GestionConsumos.TIPO_ORDEN_INSTALACION;
					if (br.getTipo_orden() == 2) {
						tipo_orden = GestionConsumos.TIPO_ORDEN_MANTENIMIENTO;
					}

					ConfirmarOrden confirmar = new ConfirmarOrden(conexion);
					if (confirmar.ConfirmarOrdenMantenimiento(br.getId(),
							br.getOrden(), observacion, estado, usuario, br.getFecha_reporte())) {

						if (gc.ConfirmarConsumos(br.getOrden(), tipo_orden)) {
							if (gb.RemoveReporteBandeja(br.getId(), GestionBandeja.COMMIT_OFF)) {
								conexion.Commit();
								out.print("OK");
							}else {
								throw new SQLException(
										"Error al eliminar reporte de la bandeja");
							}
						} else {
							throw new SQLException(
									"Error al confirmar los consumos de la orden");
						}
					}else {
						throw new SQLException(
								"Error al confirmar la orden de servicio");
					}
				} else {
					throw new SQLException(
							"Id de orden en bandeja reporte no encontrado");
				}

			}
			
			if (operacion.equals("instalacion")) {
				conexion = new db();
				String id = (String) request.getParameter("id");
				String observacion = (String) request
						.getParameter("observacion");
				String estado = (String) request.getParameter("estado");

				BandejaReporte br = new BandejaReporte();
				GestionBandeja gb = new GestionBandeja(conexion);
				if (gb.FindOrdenReporte(Integer.parseInt(id))) {
					br = gb.getOrdenbandeja();
					GestionConsumos gc = new GestionConsumos(conexion);
					gc.setUsuario(usuario);

					String tipo_orden = GestionConsumos.TIPO_ORDEN_INSTALACION;
					if (br.getTipo_orden() == 2) {
						tipo_orden = GestionConsumos.TIPO_ORDEN_MANTENIMIENTO;
					}

					ConfirmarOrden confirmar = new ConfirmarOrden(conexion);
					if (confirmar.ConfirmarOrdenInstalacion(br.getId(),
							br.getOrden(), observacion, estado, usuario, br.getFecha_reporte())) {

						if (gc.ConfirmarConsumos(br.getOrden(), tipo_orden)) {
							if (gb.RemoveReporteBandeja(br.getId(), GestionBandeja.COMMIT_OFF)) {
								conexion.Commit();
								out.print("OK");
							}else {
								throw new SQLException(
										"Error al eliminar reporte de la bandeja");
							}
						} else {
							throw new SQLException(
									"Error al confirmar los consumos de la orden");
						}
					}else {
						throw new SQLException(
								"Error al confirmar la orden de servicio");
					}
				} else {
					throw new SQLException(
							"Id de orden en bandeja reporte no encontrado");
				}

			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			out.println("Error de conexion. " + e.getMessage());
		} finally {
			if (conexion != null) {
				try {
					conexion.Close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					out.println("Error de conexion. " + e.getMessage());
				}
			}
		}

	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.ProcesarPeticion(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.ProcesarPeticion(request, response);
	}

}
